#include "SQLDeclareItem.h"

#include "../visitor/SQLASTVisitor.h"
#include "../../utils/listTran.h"
#include "../../utils/log.h"
#include "SQLName.h"
#include "statement/SQLTableElement.h"

SQLDeclareItem::SQLDeclareItem()
{
  tableElementList = SQLTableElement_list_ptr();
}

SQLDeclareItem::SQLDeclareItem(SQLName_ptr name, SQLDataType_ptr dataType)
{
  tableElementList = SQLTableElement_list_ptr();
  this->setName(name);
  this->setDataType(dataType);
}

SQLDeclareItem::SQLDeclareItem(SQLName_ptr name, SQLDataType_ptr dataType, SQLExpr_ptr value)
{
  tableElementList = SQLTableElement_list_ptr();
  this->setName(name);
  this->setDataType(dataType);
  this->setValue(value);
}

BOOL_ptr SQLDeclareItem::replace(SQLExpr_ptr expr, SQLExpr_ptr target)
{
  if (name == expr)
  {
    setName(std::dynamic_pointer_cast<SQLName>(target));
    return BOOL::TRUE;
  }

  if (value == expr)
  {
    setValue(target);
    return BOOL::TRUE;
  }

  return BOOL::FALSE;
}

void SQLDeclareItem::accept0(SQLASTVisitor_ptr visitor)
{
  if (visitor->visit(SharedObject(SQLDeclareItem)))
  {
    acceptChild(visitor, this->name);
    acceptChild(visitor, this->dataType);
    acceptChild(visitor, this->value);
    SQLObject_list_ptr tmp = ListTran::tran_class<SQLTableElement, SQLObject>(this->tableElementList);
    acceptChild(visitor, tmp);
  }
  visitor->endVisit(SharedObject(SQLDeclareItem));
}

SQLName_ptr SQLDeclareItem::getName()
{
  return name;
}

void SQLDeclareItem::setName(SQLName_ptr name_)
{
  if (name_ != NULL)
  {
    name_->setParent(SharedObject(SQLDeclareItem));
  }
  this->name = name_;
}

SQLDataType_ptr SQLDeclareItem::getDataType()
{
  return dataType;
}

void SQLDeclareItem::setDataType(SQLDataType_ptr dataType)
{
  if (dataType != NULL)
  {
    dataType->setParent(SharedObject(SQLDeclareItem));
  }
  this->dataType = dataType;
}

SQLExpr_ptr SQLDeclareItem::getValue()
{
  return value;
}

void SQLDeclareItem::setValue(SQLExpr_ptr value)
{
  if (value != NULL)
  {
    value->setParent(SharedObject(SQLDeclareItem));
  }
  this->value = value;
}

SQLTableElement_list_ptr SQLDeclareItem::getTableElementList()
{
  return tableElementList;
}

void SQLDeclareItem::setTableElementList(SQLTableElement_list_ptr tableElementList)
{
  this->tableElementList = tableElementList;
}

SQLDeclareItem::Type SQLDeclareItem::getType()
{
  return type;
}

void SQLDeclareItem::setType(SQLDeclareItem::Type type)
{
  this->type = type;
}

SQLObject_ptr SQLDeclareItem::getResolvedObject()
{
  return resolvedObject;
}

void SQLDeclareItem::setResolvedObject(SQLObject_ptr resolvedObject)
{
  this->resolvedObject = resolvedObject;
}
